const express = require('express')
const bodyParser = require("body-parser");
// const { send } = require('process');//没用

// 帮助获取错误的信息
const creatError = require("http-errors");

// 创建服务实例
const app = express()


// // 实现网站维护警告
// app.use((req,res,next) =>{
//     // 重定向
//     if(req.path === "/fix"){//但是如果输入的地址为fix就会跳到下一个，如果不写这个的话就会一直无限循环/fix,俄罗斯套娃
//         console.log('fix')
//         next();//写return是必须的，因为return会跳出use整个函数，并且跳到下一个use函数中
//         // 如果不写return,如果输入的是fix,那么就会进if语句，然后再执行重定向语句，再if语句，无限循环
//         // 如果输入的是随便的一个地址（例如/abc)，那么就会进重定向语句，然后又是if语句，然后又是重定向语句，无限循环
//     }
//         console.log('other');
//         // 重定向 强制性的让请求跳转到我们的指定路由
//         res.redirect("/fix");//只要输入地址就会被重定向为/fix
    
// }) 


// 进行post表单数据的解析
app.use(bodyParser.urlencoded({extended:false}));

// 进行静态资源管理
// app.use(express.static("public"));//从项目下的public，这个express是通过第一排的express来的


// next是个回调函数，调用next函数可以将请求传递给下一个中间件
// app.use((req,res,next) =>{
//     console.log(req.url);//url 请求的地址（路径） 除去了主机名的部分
//     next();
//     // res.send("<h1>网页正在维护中，请1年后再访问！</h1>")
// })

app.get("/fix",(req,res) =>{
    res.send("<h1>网页正在维护中，请1年后再访问！</h1>")
})

// app.post("/",(req,res) =>{
//     console.log(req.body);//不解析是undefined，解析是{ username: 'admin', password: '123' }
//     res.send(req.body);
// })

app.get('/a', (req, res,next) => {
    // console.log('体会中间件a')

    // next(console.log("66666"));

    return next(new Error("出现了错误！"))
    // return next(creatError(500,{message:"好像出现了错误"}));

    console.log("aaaaa")
    res.send('体会中间件a')//return还是写上，因为不写会执行下面的语句console.log("aaaaa"),res.send('体会中间件a')
})

// app.get('/b', (req, res) => {
//     console.log('体会中间件b')
//     res.send('体会中间件b')
// })

// app.get('/c', (req, res) => {
//     console.log('体会中间件c')
//     res.send('体会中间件c')
// })

// 404
app.use((req,res,next) =>{
    // res.status(404).send("<h1>你请求的页面不存在</h1>")
    next(creatError(404,{message:"你请求的页面不存在"}))
    //这个next不会到下一个use中，而是会选择可以接收错误（error)的use中
})


app.use((req,res,next) =>{
    // res.status(404).send("<h1>你请求的页面不存在</h1>")
    next(creatError(500,{message:"你请求的页面不存在"}))
})

// 集中的异常处理中间件
app.use((error,req,res,next) =>{
    console.log(error);
    // res.status(error.status).send(`${error.stack}`)
    res.status(error.status).send(`<h1>${error.message}<h1>`)
})



// 监听端口
app.listen(3009, () => {
    console.log('服务已启动，3009端口!!!!')
})





// 不能这样写，要是这样写next会跳到下一个use代码，
// 但是next下面的res.send('体会中间件b')也会执行，会矛盾，报错
// app.use((req, res,next) => {
//     console.log('体会中间件b');
//     next();
//     res.send('体会中间件b')
// })

// app.use((req, res,next) => {
//     console.log('体会中间件c')
//     res.send('体会中间件c')
// })